package com.demo;

import com.demo.pojo.Student;
import com.demo.pojo.User;
import com.demo.validator.Validators;
import com.raa.core.RaA;
import com.raa.core.ActionTable;

public class Main {

	public static void main(String[] args) {
		RaA
      	// 开始构造一个 RaA 实例
		.builder()
      		// 应用 Student 类上所注解的角色描述
			.role(Student.class)
      		// 也可以用如下方式:
      	//	.role("student")
      	//		.addValidator(new Validators.IsUser())
      	//		.addValidator(Validators.IsStudent.class)
      	//		.addValidator(Validators.UsernameAndPassword.class)
      	//	.role("user")
      	//	...
      
      	// 保存前述角色描述到全局 RaA 实例
		.build();
  		// 或者保存至一个名为 demo 的 RaA 实例
  	//	.build("demo");

	// 获取全局 RaA 实例
	RaA raA = RaA.global();
  
  	// 或者获取名为 demo 的 RaA 实例
 //	RaA demo = RaA.instances.get("demo");

  	// 定义一个行为表
	ActionTable actionTable = new ActionTable()
      	// 当所有验证器成功执行后，触发此响应器
		.when(ActionTable.State.Success, info -> {
          	// 通过 info.getObject() 即可取回验证对象
			Student student = (Student) info.getObject();
			return String.format("学生 %s 登录成功!", student.getName());
		})
      	// 当某个验证器失败时，出发该验证器 errCode 所返回的事件标识
		.when(Validators.Codes.NotUser, info -> {
          	// 通过 info.getValidator() 取得失败的验证器
			System.out.println(info.getValidator().getClass().getSimpleName());
			return "不是一个有效的用户";
		})
		.when(Validators.Codes.NotStudent, info -> "此用户[" + ((User) info.getObject()).getUserId() + "]身份不是学生")
		.when(Validators.Codes.LoginFail, info -> "用户名或密码错误! [" + ((User) info.getObject()).getUserId() + "]" )
      	// 当某个验证器验证过程中发生异常，将触发此事件
      	// 通过 info.getE() 取得异常对象
      	// 此时仍可以通过 info.getValidator() 取得发生异常的验证器
		.when(ActionTable.State.Crash, info -> info.getE().getMessage());

  	// 定义一个普通的用户，此处我们定义学生类型的 userId 一定是 201522033 开始
	User user = new User("1498696873", "1498696873cary");
  	// 定义一个用户名密码都正确的学生
	Student krun = new Student("20152203358", "1498696873cary", "krun");
  	// 定义一个密码错误的学生
	Student wrongPass = new Student("20152203358", "1498696873", "krun");

	Object test = user;	// 不是一个有效的用户
  //			= krun;	// 学生 krun 登录成功!
  //			= wrongPass; // 用户名或密码错误

	System.out.println(raA
			.role("student")
			.validate(test, actionTable));
	}

}
